<?php

namespace app\common\controller;

use app\common\lib\Util;
use JPush\Client as JpushClient;
use think\facade\Log;

class Jpush
{
    public $client = '';
    private static $_instance = null;

    public function __construct()
    {
        $this->client = new JpushClient(config('jpush.app_key'), config('jpush.master_secret'));
    }

    public static function getInstance()
    {
        if (empty(self::$_instance)) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    //发送好友请求 通知
    public function notifyRequest($userAlias, $titleAlert, $msgAlert, $friendId,$requestId)
    {
        try {
            $response = $this->client->push()
                ->setPlatform('all')
                //别名唯一
                ->addAlias($userAlias)
                ->setNotificationAlert($titleAlert)
                ->iosNotification($msgAlert, array(
                    'sound' => 'sound.caf',
                    'category' => 'jiguang',
                    'extras' => array(
                        'key' => 'value',
                        'jiguang'
                    ),
                ))
                ->androidNotification($msgAlert, array(
                    'title' => $titleAlert,
                    'extras' => array(
                        'key' => 'value',
                        'jiguang'
                    ),
                ))
                ->message('message content', array(
                    'title' => $titleAlert,
                    'extras' => array(
                        'key' => 'value',
                        'jiguang'
                    ),
                ))
                ->options(array(
                    'sendno' => time() . $friendId,
                    'time_to_live' => 1,
                    'apns_production' => false,
                ))
                ->send();
            Log::info($response);
            if ($response['http_code'] == 200) {
                return Util::apiResponse(['request_id' => $requestId], '', 200);
            }
        } catch (\JPush\Exceptions\APIConnectionException $e) {
            Log::info('发送好友请求失败：' . $this->pushErrorMsg($e->getCode()));
            return Util::apiResponse([], '发送好友请求失败', 400);
        } catch (\JPush\Exceptions\APIRequestException $e) {
            Log::info('发送好友请求失败：' . $this->pushErrorMsg($e->getCode()));
            return Util::apiResponse([], '发送好友请求失败', 400);
        }

    }


    //发送好友请求 自定义消息
    public function CustomizeRequest($userAlias,$data, $titleAlert, $msgAlert, $friendId,$requestId)
    {
        try {
            $response = $this->client->push()
                ->setPlatform('all')
                ->addAlias($userAlias)
                ->setNotificationAlert($titleAlert)
                ->message('添加好友请求', $data)
                ->iosNotification($msgAlert, array(
                    'sound' => 'sound.caf',
                    'category' => 'jiguang',
                    'extras' => array(
                        'key' => 'value',
                        'jiguang'
                    ),
                ))
                ->androidNotification($msgAlert, array(
                    'title' => $titleAlert,
                    'extras' => array(
                        'key' => 'value',
                        'jiguang'
                    ),
                ))
                ->send();
            if ($response['http_code'] == 200) {
                return Util::apiResponse(['request_id' => $requestId], '', 200);
            }
        } catch (\JPush\Exceptions\APIConnectionException $e) {
            Log::info('发送好友请求失败：' . $this->pushErrorMsg($e->getCode()));
            return Util::apiResponse([], '发送好友请求失败', 400);
        } catch (\JPush\Exceptions\APIRequestException $e) {
            Log::info('发送好友请求失败：' . $this->pushErrorMsg($e->getCode()));
            return Util::apiResponse([], '发送好友请求失败', 400);
        }
    }




    public function pushErrorMsg($errorCode = 0)
    {
        $errMsg = '';
        switch ($errorCode) {
            case 1000:
                $errMsg = '系统内部错误';
                break;
            case 1001:
                $errMsg = '只支持 HTTP Post 方法';
                break;
            case 1002:
                $errMsg = '缺少了必须的参数';
                break;
            case 1003:
                $errMsg = '参数值不合法';
                break;
            case 1004:
                $errMsg = '验证失败';
                break;
            case 1005:
                $errMsg = '消息体太大';
                break;
            case 1008:
                $errMsg = 'app_key 参数非法';
                break;
            case 1009:
                $errMsg = '推送对象中有不支持的 key';
                break;
            case 1011:
                $errMsg = '没有满足条件的推送目标';
                break;
            case 1012:
                $errMsg = '符合当前条件的推送已超过限制';
                break;
            case 1020:
                $errMsg = '只支持 HTTPS 请求';
                break;
            case 1030:
                $errMsg = '内部服务超时';
                break;
            case 2002:
                $errMsg = 'API调用频率超出该应用的限制';
                break;
            case 2003:
                $errMsg = '该应用 appkey 已被限制调用 API';
                break;
            case 2004:
                $errMsg = '无权限执行当前操作';
                break;
            case 2005:
                $errMsg = '信息发送量超出合理范围';
                break;
            default:
                break;
        }
        return $errMsg;
    }

    //测试
    public function test()
    {
        try {
            $response = $this->client->push()
                ->setPlatform('all')
                // 一般情况下，关于 audience 的设置只需要调用 addAlias、addTag、addTagAnd  或 addRegistrationId
                // 这四个方法中的某一个即可，这里仅作为示例，当然全部调用也可以，多项 audience 调用表示其结果的交集
                // 即是说一般情况下，下面三个方法和没有列出的 addTagAnd 一共四个，只适用一个便可满足大多数的场景需求
                //别名唯一
                //->addAlias('user3')
                // ->addTag(array('user4', 'tag2'))
                //->addRegistrationId()
                ->addAllAudience()
                ->setNotificationAlert('Hi, JPush')
                ->iosNotification('Hello IOS', array(
                    'sound' => 'sound.caf',
                    // 'badge' => '+1',
                    // 'content-available' => true,
                    // 'mutable-content' => true,
                    'category' => 'jiguang',
                    'extras' => array(
                        'key' => 'value',
                        'jiguang'
                    ),
                ))
                ->androidNotification('Hello Android', array(
                    'title' => 'hello jpush',
                    // 'builder_id' => 2,
                    'extras' => array(
                        'key' => 'value',
                        'jiguang'
                    ),
                ))
                ->message('message content', array(
                    'title' => 'hello jpush',
                    // 'content_type' => 'text',
                    'extras' => array(
                        'key' => 'value',
                        'jiguang'
                    ),
                ))
                ->options(array(
                    // sendno: 表示推送序号，纯粹用来作为 API 调用标识，
                    // API 返回时被原样返回，以方便 API 调用方匹配请求与返回
                    // 这里设置为 100 仅作为示例
                    'sendno' => 100,
                    // time_to_live: 表示离线消息保留时长(秒)，
                    // 推送当前用户不在线时，为该用户保留多长时间的离线消息，以便其上线时再次推送。
                    // 默认 86400 （1 天），最长 10 天。设置为 0 表示不保留离线消息，只有推送当前在线的用户可以收到
                    // 这里设置为 1 仅作为示例
                    'time_to_live' => 1,
                    // apns_production: 表示APNs是否生产环境，
                    // True 表示推送生产环境，False 表示要推送开发环境；如果不指定则默认为推送开发环境
                    'apns_production' => false,
                    // big_push_duration: 表示定速推送时长(分钟)，又名缓慢推送，把原本尽可能快的推送速度，降低下来，
                    // 给定的 n 分钟内，均匀地向这次推送的目标用户推送。最大值为1400.未设置则不是定速推送
                    // 这里设置为 1 仅作为示例
                    // 'big_push_duration' => 1
                ))
                ->send();

        } catch (\JPush\Exceptions\APIConnectionException $e) {

        } catch (\JPush\Exceptions\APIRequestException $e) {

        }
    }

}
